package cn.jasonone.jasonfx.interceptor;

import cn.jasonone.jasonfx.entity.Optional;
import net.sf.cglib.proxy.MethodProxy;

/**
 * 控制器拦截器
 * 
 * @author Jason
 * @date: 2020-01-25 13:09
 */
@FunctionalInterface
public interface ControllerInterceptor {
	/**
	 * 是否拦截,默认全部拦截
	 * 
	 * @return boolean
	 */
	default boolean isInterceptor(Object obj, MethodProxy proxy)throws Throwable {
		return true;
	}

	/**
	 * 前置拦截器,如没有则返回null
	 * 
	 * @return 前置拦截器类型
	 */
	default Class<? extends ControllerInterceptor> preInterceptor() throws Throwable{
		return null;
	}

	/**
	 * 方法拦截
	 * 
	 * @param obj         代理对象
	 * @param proxy       代理方法
	 * @param args        方法入参
	 * @param returnValue 方法返回值,仅当{@link ControllerInterceptor#intercept(Object, MethodProxy, Object[], Optional)}方法返回false时有效
	 * @param chain       拦截器链
	 * @throws Throwable
	 */
	public void intercept(Object obj, MethodProxy proxy, Object[] args, Optional<Object> returnValue,
			InterceptorChain chain) throws Throwable;
}
